#pragma once

#include "../utils/object.h"

namespace fusion_perception {

class Tracker;
class AssociateFactor {
public:
    AssociateFactor(std::string name, int32_t weight);
    virtual int32_t assessScore(const Object&, const Object&) const;
    virtual int32_t assessScore(std::shared_ptr<Tracker> tracker, const Object& o2) const;

    std::string getName(void) const;
    int32_t getWeight(void) const;

private:
    std::string name_;
    int32_t weight_;
};

class FeatureAssociateFactor : public AssociateFactor {
    using AssociateFactor::AssociateFactor;

public:
    int32_t assessScore(const Object&, const Object&) const;
};

class PositionXAssociateFactor : public AssociateFactor {
    using AssociateFactor::AssociateFactor;

public:
    int32_t assessScore(const Object&, const Object&) const;
};

class PositionYAssociateFactor : public AssociateFactor {
    using AssociateFactor::AssociateFactor;

public:
    int32_t assessScore(const Object&, const Object&) const;
};

class HeadingAssociateFactor : public AssociateFactor {
    using AssociateFactor::AssociateFactor;

public:
    int32_t assessScore(const Object&, const Object&) const;
};

class HistoryIdAssociateFactor : public AssociateFactor {
    using AssociateFactor::AssociateFactor;

public:
    int32_t assessScore(std::shared_ptr<Tracker> tracker, const Object&) const;
};

class TypeAssociateFactor : public AssociateFactor {
    using AssociateFactor::AssociateFactor;

public:
    int32_t assessScore(const Object&, const Object&) const;
};

}